package com.wuxinwudai.android.widget;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.support.annotation.DrawableRes;
import android.support.v4.content.ContextCompat;
import android.support.v4.graphics.drawable.DrawableCompat;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.EditText;

import com.wuxinwudai.android.R;

/**
 * ClearEditText 类为自带清除按钮的输入框，清除按钮的作用是清空输入框的输入内容；
 * 需要注意的是，清除按钮会占据drawableRight的位置，所以设置drawableRight会无效
 * @author 吾心无待 于2016年7月26日
 */
public class ClearEditText extends EditText  implements TextWatcher
{
    private Drawable mClearTextIcon;//清楚图标

    /**
     * 构造函数，初始化 ClearEditText 类的一个新实例
     * @param context 上下文对象
     */
    public ClearEditText(Context context)
    {
        this(context,null);
    }

    /**
     * 构造函数，初始化 ClearEditText 类的一个新实例
     * @param context 上下文对象
     * @param attrs 属性列表
     */
    public ClearEditText(Context context, AttributeSet attrs)
    {
        this(context, attrs,0);
    }

    /**
     * 构造函数，初始化 ClearEditText 类的一个新实例
     * @param context 上下文对象
     * @param attrs 属性列表
     * @param defStyleAttr 默认属性
     */
    public ClearEditText(Context context, AttributeSet attrs, int defStyleAttr)
    {
        super(context, attrs, defStyleAttr);
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.ClearEditText);
        // 获取清除按钮图标资源
        int iconClear = typedArray.getResourceId(R.styleable.ClearEditText_ClearTextIcon, R.mipmap.del_gray_16x16);
        final Drawable drawable = ContextCompat.getDrawable(context,iconClear);
        mClearTextIcon = DrawableCompat.wrap(drawable);
        mClearTextIcon.setBounds(0,0,mClearTextIcon.getIntrinsicHeight(),mClearTextIcon.getIntrinsicHeight());
        typedArray.recycle();
        setClearTextIconState();
        addTextChangedListener(this);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event)
    {
        if (event.getAction() == MotionEvent.ACTION_DOWN)
        {
            // 点击是的 x 坐标
            int xDown = (int) event.getX();
            // 清除按钮的起始区间大致为[getWidth() - getCompoundPaddingRight(), getWidth()]，
            // 点击的x坐标在此区间内则可判断为点击了清除按钮
            if (xDown >= (getWidth() - getCompoundPaddingRight()) && xDown < getWidth())
            {
                // 清空文本
                setText("");
            }
        }
        return super.onTouchEvent(event);
    }

    /**
     * 设置清除按钮图标显示状态
     */
    private void setClearTextIconState()
    {
        // 获取设置好的drawableLeft、drawableTop、drawableRight、drawableBottom
        Drawable[] drawables = getCompoundDrawables();
        if (length() > 0) //输入框有输入内容才显示删除按钮
        {
            setCompoundDrawablesWithIntrinsicBounds(drawables[0], drawables[1], mClearTextIcon, drawables[3]);
        }
        else
        {
            setCompoundDrawablesWithIntrinsicBounds(drawables[0], drawables[1], null, drawables[3]);
        }
    }

    /**
     * 设置清除按钮图标样式
     * @param resId 图标资源id
     */
    public void setClearTextIcon(@DrawableRes int resId)
    {
        mClearTextIcon = getResources().getDrawable(resId);
        setClearTextIconState();
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

    @Override
    public void afterTextChanged(Editable s) {

    }

    @Override
    public final void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
       setClearTextIconState();
    }
}